import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

// 根store的mutations和actions
import mutations from './mutations'
import actions from './actions'

// 模块内的store
import DemoModel from "./Demo"
import GradeModel from "./Grade"

// 声明一个store实例 => 默认暴露该实例
export default  new Vuex.Store({
	// state管理数据(状态)
	state: {
		a: 1,
		b: 2,
	},
	getters: {
		// 键名:计算属性名
		// 键值:a. 是一个函数  => 可以根据函数的返回值得到一个新值
		// 

		// getters 相当于是vuex中计算属性 -> 可以根据 state中的数据得到一个新值,并缓存结果, 当依赖的state数据发生改变,重新结算缓存新的结果
		doubleA: function (state) {
			return state.a * 2;
		},
		tripleA: function (state) {
			return state.a * 3;
		},
		doubleB: function (state) {
			return state.b * 2;
		},
		tripleB: function (state) {
			return state.b * 3;
		},
		// Getter 也可以接受其他 getters 作为第二个参数：
		doubleBoth: function (state, getters) {
			return getters.doubleA + getters.doubleB;
		},
		// 是一个函数  => 可以根据函数的返回值得到一个新值 (还是一个函数) => 可以被调用(接收参数)
		// bothN:function(state){
		// 	return function(n){
		// 		return (state.a+state.b)*n;
		// 	};
		// },
		bothN: state => n => (state.a + state.b) * n,

	},
	mutations: mutations,
	actions:actions ,
	modules:{
		// 默认情况下，模块内部的 action、mutation 和 getter 是注册在全局命名空间
		// 好处: 在模块内获取action、mutation 和 getter时,直接使用全局获取就可以了
		// 缺点: 如果多个模块内有相同的方法  => 会发生覆盖
		// demo:DemoModel,

		demo:{
			namespaced:true,
			...DemoModel,
		},
		grade:GradeModel,
	}
})
